package fr.univnantes.lina.uima.connectors.csv.ae;

import au.com.bytecode.opencsv.CSVReader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.uima.UimaContext;
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.ResourceInitializationException;

import fr.univnantes.lina.uima.types.Grammaire;
//import org.apache.uima.tutorial.Grammaire;

//import fr.univnantes.lina.uima.util.UIMAUtilities;
//import fr.univnantes.lina.util.JavaUtilities;

public class CSV2CASAE extends JCasAnnotator_ImplBase {

	private static final String ADDRESS_FILE="resources/fichierCSV.csv";
	private static String [][] tabCSV;
	private static final int NUM_COLUMN_BEGIN=0;	//numéro de la colonne du Begin dans le csv (ici, colonne 0)
	private static final int NUM_COLUMN_END=1;	//numéro de la colonne du End dans le csv (ici, colonne 1)
	private static final int NUM_COLUMN_NATURE=2;	//numéro de la colonne de la nature du mot dans le csv (ici, colonne 2)
	private static int nbLignesCSV=0;
	private static int nbColonnesCSV=0;	


    public void initialize(UimaContext aContext)
    throws ResourceInitializationException
    {
		List<String[]> listCSV = loadCSV();
		nbLignesCSV = getNbLignes(listCSV);
		System.err.println("Warning: nbLignesCSV = "+ nbLignesCSV);
		nbColonnesCSV = getNBcolonne(listCSV);
		System.err.println("Warning: nbColonnesCSV = "+ nbColonnesCSV);
		tabCSV = createTable(nbLignesCSV,nbColonnesCSV,listCSV);
	}

	@Override
	public void process(JCas aJCas) throws AnalysisEngineProcessException {
		// TODO Auto-generated method stub
		int numLigneTab=0;	// numéro de la ligne de notre tableau

		
		while (numLigneTab != nbLignesCSV) {
			Grammaire annotation = new Grammaire(aJCas);
		    annotation.setNature(tabCSV[numLigneTab][NUM_COLUMN_NATURE]);
		    annotation.setBegin(Integer.parseInt(tabCSV[numLigneTab][NUM_COLUMN_BEGIN]));	// conversion du string en int
		    annotation.setEnd(Integer.parseInt(tabCSV[numLigneTab][NUM_COLUMN_END]));
		    annotation.addToIndexes();

			numLigneTab++;
		}
	}
	
	
	public List<String[]> loadCSV(){
		List<String[]> listCSV = null;
		CSVReader reader = null;
		try {
			reader = new CSVReader(new FileReader(ADDRESS_FILE),';');
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}	
		try {
			listCSV = reader.readAll();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return listCSV;
	}
	
	/*
	 * Return the number of columns of the first csv line which is not a comment (i.e. not starting with the '#' symbol)
	 * @return the number of columns
	 */
	public int getNBcolonne(List<String[]> list){
		
		Iterator<String[]> listIter = list.iterator();
		int numberOfColumn=0;
		while(listIter.hasNext()){
			String[] aLineOfListCSV = (String[]) listIter.next();
			if (!(aLineOfListCSV[0].startsWith("#"))) {
				numberOfColumn = aLineOfListCSV.length;
				break;
			}
		}
		return numberOfColumn;
	}
	
	/**
	 * Retourne un tableau de String de String correspondant au contenu du fichier csv 
	 * @param nbLignesCSV 
	 * @param nbColonnesCSV
	 * @param list 
	 * @return 		Retourne un tableau de String de String (String[nombre de lignes][nombre de colonnes])
	 * 				correspondant au contenu du fichier csv 
	 */
	public String[][] createTable(int nbLignesCSV, int nbColonnesCSV, List<String[]> list){
		tabCSV = new String[nbLignesCSV][nbColonnesCSV];
		Iterator<String[]> listIterator = list.listIterator(); 
		int currentNumberLineTab = 0;
		while ((listIterator.hasNext())) {	// tant que le CSV à des lignes
			//System.out.println(nextLine[0] + " " + nextLine[1] + " " + nextLine[2] );
			String[] Line = listIterator.next();
			// pour le nombre de colonnes du CSV, faire
			for (int currentNumberColumnTab  = 0; currentNumberColumnTab < nbColonnesCSV ; currentNumberColumnTab ++){ 
				tabCSV [currentNumberLineTab][currentNumberColumnTab ] = Line[currentNumberColumnTab ];
			System.err.println("Warning: for line:"+ currentNumberLineTab +" Column:"+ currentNumberColumnTab  + " Value:" + Line[currentNumberColumnTab ]);}
			currentNumberLineTab++;
		}
		return tabCSV;
	}
	/**
	 * 
	 * @param listCSV	notre liste de String[] dont on veut compter le nombre de lignes
	 * @return			retourne un int de la valeur du nombre de lignes passées en paramètres
	 */
	public int getNbLignes(List<String[]> listCSV){
		return listCSV.size();
	}
}

